// app/middleware/auth.js
module.exports = () => {
    return async function authMiddleware(ctx, next) {
      const authorization = ctx.request.header.authorization;
      let index = ctx.noAuthenticationApi.findIndex(item => item.url === ctx.request.url && item.method === ctx.request.method)
      console.log('ctx.request.url', ctx.request.url, ctx.request.method)
      console.log(index, authorization)
    if(ctx.request.method === 'OPTIONS') {
      console.log(0)
      // 在跨域请求中，浏览器会先发送一次OPTIONS请求，
      // 来获取服务器是否支持跨域访问以及允许的HTTP方法和请求头信息等。这个过程被称为预检请求（Preflight Request）。
      ctx.set('Access-Control-Allow-Methods', 'GET,HEAD,PUT,POST,DELETE,PATCH');
      ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
      ctx.status = 204; // No Content
      return;
    } else if(index > -1) {
        console.log(1)
        await next();
    } else if(ctx.path.startsWith('/api/articles/') && ctx.request.method === 'GET' && !ctx.path.startsWith('/api/articles/feed')) {
      console.log('2.5')
      // 在authMiddleware中间件中，怎么匹配/api/articles/:slug路由，单独不设置身份验证。
      // 但是/api/articles/feed需要身份验证
      await next();
    } else if(!authorization) {
        console.log(2)
        ctx.throw(ctx.errorMap.authorizationRequired.code, ctx.errorMap.authorizationRequired.message);
    } else {
        try {
            const decoded = ctx.app.jwt.verify(authorization, ctx.app.config.jwt.secret);
            console.log('decoded', decoded)
            ctx.state.user = decoded;
        } catch (err) {
            ctx.throw(ctx.errorMap.invalidToken.code, ctx.errorMap.invalidToken.message);
        }
        console.log(3)
        await next();
      }
    };
  };